package com.rabbitmq.demo;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @ClassName Producer
 * @Description 生产者
 * @Author Kx
 * @Date 2025/10/9 10:03
 * @Version 1.0
 */
public class Producer {
    /**
     * 消息队列
    */
    private static final String QUEUE_NAME = "test";

    private static final ConnectionFactory connectionFactory;

    /**
     * 初始化连接工厂
    */
    static {
        connectionFactory = new ConnectionFactory();
        // 设置连接地址
        connectionFactory.setHost("localhost");
        // 设置连接端口
        connectionFactory.setPort(5672);
    }

    /**
     * 发送消息
    */
    public static void send(String message) {
        // 创建连接
        try (Connection connection = connectionFactory.newConnection();
             // 使用连接对象构建一个消息通信的通道
            Channel channel = connection.createChannel()) {
            // 创建队列
            // 参数1：队列名称
            // 参数2：是否持久化（true 表示持久化）
            // 参数3：是否排他（true 表示排他），排他性指的是队列只对首次创建的连接(connection)可见，false 表示可以被所有的连接可见
            // 参数4：设置 true 表示断开连接时自动删除队列
            // 参数5：队列的其他属性设置，是一个 map集合
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            // 投递消息
            // 参数一：交换机名称 设置为 "" 表示为指定交换机的名称为空，此时 rabbitmq 会通过一个默认的交换机进行消息投递
            // 参数二：队列的名称
            // 参数三：消息头的属性信息，如果没有就设置为空
            // 参数四：消息内容，必须将消息转换为字节数组再投递
            channel.basicPublish("" , QUEUE_NAME, null, message.getBytes());
        } catch (Exception e) {
            throw new RuntimeException("操作失败" + e);
        }
    }

    public static void main(String[] args) {
        send("hello world");
    }
}
